package cn.lzm.server.tcp;

import cn.lzm.protocol.ProtocolConst;
import io.vertx.core.Handler;
import io.vertx.core.buffer.Buffer;
import io.vertx.core.parsetools.RecordParser;


/**
 * @author lzm
 * @Date 2024/11/7
 * @description 装饰着模式，对原有的buffer处理能力进行增强，用来在底层buffer增加解决半包，粘包问题的能力
 * 总而言之，装饰着模式是修改框架源码的方法
 */
public class TcpBufferHandlerWrapper implements Handler<Buffer> {

    private final RecordParser recordParser;

    public TcpBufferHandlerWrapper(Handler<Buffer> bufferHandler) {
        this.recordParser = initRecordParser(bufferHandler);
    }

    private RecordParser initRecordParser(Handler<Buffer> bufferHandler) {
        RecordParser parser = RecordParser.newFixed(ProtocolConst.MESSAGE_HEADER_LENGTH);
        parser.setOutput(new Handler<>() {

            int size = -1;

            Buffer resultBuffer = Buffer.buffer();

            @Override
            public void handle(Buffer buffer) {
                if (size == -1) {
                    // 读取消息体长度
                    size = buffer.getInt(13);
                    parser.fixedSizeMode(size);
                    resultBuffer.appendBuffer(buffer);
                } else {
                    // 写入消息体到结果中
                    resultBuffer.appendBuffer(buffer);

                    // 已拼接完整buffer，执行处理
                    bufferHandler.handle(resultBuffer);

                    // 重置一轮
                    parser.fixedSizeMode(ProtocolConst.MESSAGE_HEADER_LENGTH);
                    size = -1;
                    resultBuffer = Buffer.buffer();
                }
            }
        });
        return parser;
    }

    @Override
    public void handle(Buffer event) {
        recordParser.handle(event);
    }


}
